home *** CD-ROM | disk | FTP | other *** search
Text File | 1985-08-22 | 20.0 KB | 813 lines | [TEXT/Anon] |
- IDENT CYIOS
- OPTION SUBTTL,CREF
- MODULE
- INCLUDES MACTEXT
- PAGE ,132
- CYIOS TITLE CYCLAN SYSTEM INTERFACE ROUTINES.
- ** CYIOS - CYCLAN SYSTEM INTERFACE.
- *
- * Copyright (c) 1985 by J. R. Hogue.
-
- ENTRY IOASM,IOCLS,IOEND,IOINIT,IOINF,IOFSIZ,IOKBDR,IOKBDS
- ENTRY IOMSG,IOOPEN,IOPUR,IOREAD,IOREADB,IOREADO,IOSFN
- ENTRY IOWCH,IOWCR,IOWCL,IOWRITE,IOWRITEB,IOWRITEO,IOWRITES
- ENTRY CREATF,IOOPENR,INFT,IOSUBS,CREA,IOPROP
-
- FNFERR EQU -43 FILE NOT FOUND
- ASM SPACE 4,10
- ** ASM - WRITE APPLICATION RESOURCE FILE.
- *
- * ENTRY A1 - FIT FOR OBJECT FILE.
-
- ASM LEA ASMA(PC),A0 FILE PARAMETER BLOCK 1
- MOVE.L A0,A4
- MOVEQ #$32/4-1,D0
- ASM1 CLR.L (A0)+
- DBF D0,ASM1
- LEA ASMA(PC),A0
- LEA ASMB(PC),A3
- MOVE.L A3,ioFileName(A0) MAC.68K APPL FILE NAME
- MOVE.B #1,ioPermssn(A0) READ PERMISSION
- _OpenRF
- BNE.S ASMX IF FILE NOT AVAILABLE
-
- CLR D0 OPEN RESOURCE FORK IN WRITE MODE
- BSR IOPR
- BNE.S ASMX IF ERROR ON OPEN
- MOVE.L A0,A3
- LEA ASMC(PC),A2 READ/WRITE BUFFER
- MOVEQ #127,D2 READ/WRITE ONE SECTOR
- ADDQ #1,D2
-
- * COPY FILE.
-
- ASM2 MOVE.L A4,A0
- MOVE.L D2,ioByteCount(A0)
- MOVE.L A2,ioBuffer(A0)
- _Read
- BNE.S ASM3 IF END OF FILE
- MOVE.L A3,A0
- MOVE.L D2,ioByteCount(A0)
- MOVE.L A2,ioBuffer(A0)
- _Write OUTPUT THE BYTES
- BRA ASM2
-
- ASM3 MOVE.L ioNumDone(A0),D2 REMAINING BYTES
- MOVE.L A3,A0
- MOVE.L D2,ioByteCount(A0)
- MOVE.L A2,ioBuffer(A0)
- _Write WRITE PARTIAL SECTOR
- _Close .68K RESOURCE FORK
- MOVE.L A4,A0
- _Close APPL LOADER FILE
-
- ASMX RTS
-
- ASMA DS.B $50 FILE PARAMETER BLOCK 1
- ASMB STR 'MLOAD' APPL LOADER FILE NAME
- ASMC DS.B 128 SECTOR BUFFER
- CLS SPACE 4,10
- ** CLS - CLOSE FILE.
- *
- * ENTRY A1 - FIT.
-
- CLS BSR FILTF
- BLE IORET IF NOT A DISK FILE
- LEA FFPB(A1),A0
- MOVE.L A5,-(SP)
- MOVE.L CurrentA5,A5
- MOVE.L FBIW(A1),D0
- SUB.L FBOW(A1),D0
- BLE.S CLS1 IF NO DATA TO FLUSH
- CMP.B #2,ioPermssn(A0)
- BNE.S CLS1 IF NOT IN WRITE MODE
- MOVE.L FBOW(A1),ioBuffer(A0) DATA BUFFER
- MOVE.L D0,ioByteCount(A0) BYTE COUNT
- _Write FLUSH FIT BUFFER
- CLS1 _Close CLOSE FILE
- MOVE.L (SP)+,A5
- RTS
- CREATF SPACE 4,10
- ** CREATF - CREATE A FILE.
-
- CREATF LEA FFPB(A1),A0
- _Create
- BNE.S CREX ;IF ERROR
- _GetFileInfo
- LEA ioFLUsrWds(A0),A2
- MOVE.L INFT(PC),(A2)+ ;FILE TYPE
- MOVE.L CREA(PC),(A2)+ ;FILE CREATOR
- MOVE #$0,(A2) ;FLAGS
- _SetFileInfo
- BNE.S CREX
- NOP
- CREX RTS
-
- CREA DC.L 'Anon' ;CREATOR NAME
- DAT SPACE 4,10
- ** DAT - GET DATE AND TIME.
- *
- * ENTRY A2 - DESTINATION BUFFER.
-
- DAT MOVE.L A2,A3
- LEA DTREC(PC),A0 DATE/TIME RECORD
- MOVE.L Time,D0 SYSTEM TIME
- _Secs2Date
- LEA D_DATE+1(PC),A2
- MOVEQ #2,D0
- CLR.L D1
- MOVE (A0)+,D1 YEAR
- SUB #1900,D1
- BSR DTA
- ADDQ #1,A2
- MOVEQ #2,D0
- MOVE (A0)+,D1 MONTH
- BSR DTA
- ADDQ #1,A2
- MOVEQ #2,D0
- MOVE (A0)+,D1 DAY
- BSR DTA
- LEA D_TIME+1(PC),A2
- MOVEQ #2,D0
- MOVE (A0)+,D1 HOUR
- BSR DTA
- ADDQ #1,A2
- MOVEQ #2,D0
- MOVE (A0)+,D1 MINUTE
- BSR DTA
- ADDQ #1,A2
- MOVEQ #2,D0
- MOVE (A0)+,D1 SECOND
- BSR DTA
- MOVEQ #10+10-1,D0
- LEA D_DATE(PC),A1
- DAT1 MOVE.B (A1)+,(A3)+ TRANSFER DATE/TIME
- DBF D0,DAT1
- RTS
-
- D_DATE DC.W #10H 85/05/08
- D_TIME DC.W #10H 22:00:00
- DTREC DS 7 DATE/TIME RECORD
- DTA SPACE 4,10
- ** DTA - DECIMAL TO ASCII.
- *
- * ENTRY D0 - NUMBER OF DIGITS TO CONVERT.
- * D1 - DECIMAL VALUE.
- * A2 - DESTINATION ADDRESS.
-
- DTA LEA DTAB(PC),A4
- SUBQ #1,D0
- DTA1 MOVE (A4)+,D5
- MOVEQ #'0'-1,D6
- DTA2 ADDQ.B #1,D6 SEARCH FOR OUR DIGIT
- SUB D5,D1
- BCC DTA2 IF NOT THERE YET
- ADD D5,D1 BACK UP
- MOVE.B D6,(A2)+
- DBF D0,DTA1
- RTS
-
- DTAB DC 10,1 TENS,UNITS
- IOPR SPACE 4,10
- ** IOPR - OPEN FILE RESOURCE FORK.
- *
- * ENTRY A1 - FIT ADDRESS.
- * D0 - OPEN TYPE.
- * 0 - OPEN EXISTING FILE (WRITE ACCESS)
- * 3 - OPEN EXISTING FILE (READ ACCESS).
- *
- * EXIT CCR - .NE. IF ERROR.
- * D0 - ERROR CODE.
-
-
- IOPR LEA FBFW(A1),A0 RESET BUFFER POINTERS
- MOVE.L (A0)+,(A0)
- MOVE.L (A0)+,(A0)
- LEA FFPB(A1),A0 FILE PARAMETER BLOCK
- BSR FILTF
- BLE.S IOPRXX IF NOT A DISK FILE
- MOVE.L A5,-(SP)
- MOVE.L CurrentA5,A5
- MOVEQ #1,D2 READ PERMISSION
- CMP #3,D0
- BEQ.S IOPR1 IF OPEN *READ*
- MOVEQ #2,D2 WRITE PERMISSION
- TST D0
- BNE.S IOPRX IF NOT OPEN *WRITE*
- IOPR1 MOVE.B D2,ioPermssn(A0) PERMISSION TYPE
- CLR.L ioOwnBuf(A0) USE VOLUME BUFFER
- _OpenRF OPEN FILE
- BEQ.S IOPR2 IF FILE OPEN
- CMP #2,D2
- BNE.S IOPRX IF NOT OPEN WRITE
- CMP #fnFerr,D0
- BNE.S IOPRX IF FILE EXISTS
- BSR CREATF
- BEQ IOPR1
- IOPRX MOVE.L (SP)+,A5
- IOPRXX RTS
-
- IOPR2 SUBQ #2,D2
- BNE IOPRX IF NOT OPEN WRITE
- _GetFileInfo
- LEA ioFLUsrWds(A0),A2
- MOVE.L IOPRA(PC),(A2)+ ;FILE TYPE
- MOVE.L IOPRB(PC),(A2)+ ;FILE CREATOR
- MOVE #$0,(A2) ;FLAGS
- _SetFileInfo
- BRA IOPRX
-
- IOPRA DC.L #'APPL'
- IOPRB DC.L #'CYAN'
- PROP SPACE 4,10
- ** PROP - OPEN PRINT DRIVER.
-
- PROP LEA PRNR(PC),A0 PRINTER RECORD
- MOVE.L A3,-(SP)
- LEA PROPN(PC),A3
- TST.B (A3)
- BNE.S PROPX IF ALREADY OPEN
- ST (A3)
- MOVEQ #$32/4-1,D0
- PROP1 CLR.L (A0)+
- DBF D0,PROP1
- LEA PRNR(PC),A0
- LEA PROPA(PC),A3
- MOVE.L A3,ioFileName(A0) PRINTER OUTPUT PORT
- MOVE.B #2,ioPermssn(A0) WRITE PERMISSION
- _Open
- PROPX MOVE.L (SP)+,A3
- RTS
-
- PRNR DS.B $32 PRINTER RECORD
- PROPA STR '.BOut' PRINTER PORT NAME
- PROPN DS.B 1
- SFN SPACE 4,10
- * SFN - SET FILE NAME.
- *
- * ENTRY A1 - FIT.
- * A3 - FILE NAME (8 CHARACTERS BLANK FILLED).
- * D5 - EXTENSION (3 CHARACTERS RIGHT JUSTIFIED).
-
- SFN MOVEM.L D1/D3/A0/A4/A6,-(SP)
- MOVEQ #0,D0 CALCULATE FILE NAME LENGTH
- MOVEQ #' ',D3
- MOVE.L A3,A2
- LEA FSTR(A1),A0 BUILD FILE NAME STRING
- MOVE.L A0,A4
- CLR.B (A4)+
- MOVEQ #8-1,D1
- SFN1 MOVE.B (A2)+,D2
- CMP.B D3,D2
- BEQ.S SFN2 IF END OF NAME
- MOVE.B D2,(A4)+
- DBF D1,SFN1
- SFN2 LEA SFNA(PC),A6
- MOVE.L D5,(A6)
- ADDQ #1,A6
- CMP.B (A6),D3
- BEQ.S SFN4 IF NO EXTENSION
- MOVE.B #'.',(A4)+
- MOVEQ #3-1,D1
- SFN3 MOVE.B (A6)+,D2
- CMP.B D3,D2
- BEQ.S SFN4 IF END OF EXTENSION
- MOVE.B D2,(A4)+
- DBF D1,SFN3
- SFN4 MOVE.L A4,D0
- SUB.L A0,D0
- SUBQ #1,D0
- MOVE.B D0,(A0) LENGTH OF FILE NAME
- MOVE.L A0,FFPB+ioFileName(A1) PTR
- MOVEM.L (A3),D0/D1
- MOVEM.L D0/D1,FNAM(A1) FILE NAME
- CLR FFPB+ioVRefNum(A1) CLEAR VOLUME REFERENCE NUMBER
- CLR.L FFPB+ioCompletion(A1) CLEAR COMPLETION ROUTINE POINTER
- MOVEM.L (SP)+,D1/D3/A0/A4/A6
- RTS
- SFNA DS.B 4
- WCR SPACE 4,10
- ** WCR - WRITE CARRIAGE RETURN.
- * WCH - WRITE CHARACTER TO SCREEN.
-
- WCR MOVEQ #$0D,D0 ;CARRIAGE RETURN
- WCH CMP.B #$0A,D0
- BEQ.S WCHXX ;IF LINE FEED
- MOVEM.L A0/A1/A3/A5/D3,-(SP)
- MOVE.L CurrentA5,A5
- MOVE D0,-(SP)
- MOVE D0,D3
- MOVE.L INTE(PC),-(SP) ;HANDLE
- _TEKey
- CMP.B #$0D,D3
- BEQ.S WCH1 ;SCROLL UP
- WCHX MOVEM.L (SP)+,A0/A1/A3/A5/D3
- WCHXX RTS
-
- * MOVE LINES UP.
-
- WCH1 MOVE.L INTE(PC),A0 ;LOOK AT TE RECORD
- MOVE.L (A0),A3
- MOVEQ #0,D3
- MOVE teViewRect+W+W(A3),D3
- SUB teViewRect(A3),D3 ;WINDOW HEIGHT
- DIVU teLineHite(A3),D3 ;LINES IN WINDOW
- WCH2 MOVE teNLines(A3),D0
- CMP D3,D0
- BLT WCHX ;IF NOT AT BOTTOM OF SCREEN
- MOVE teLines(A3),teSelStart(A3) ;DELETE FIRST LINE
- MOVE teLines+2(A3),teSelEnd(A3)
- MOVE.L A0,-(SP)
- _TEDelete
- MOVE D3,D0
- LSL #1,D0
- LEA teLines(A3),A0
- MOVE 0(A0,D0),D0 ;START OF LAST DISPLAYABLE LINE
- MOVE D0,teSelStart(A3)
- MOVE D0,teSelEnd(A3)
- MOVE.L INTE(PC),A0
- BRA WCH2 ;RECHECK JUST IN CASE SCREEN SHRANK
- WCL SPACE 4,10
- ** WCL - WRITE CONSOLE LINE.
- *
-
- WCLB SUBQ #1,D0 SKIP LINE FEED AT END OF LINE
- WCL MOVE.L A5,-(SP)
- MOVE.L CurrentA5,A5
- SUBQ #1,D0
- BLE.S WCL1 NULL LINE
- MOVE.L A1,-(SP)
- MOVE.L A0,-(SP) START OF LINE
- MOVE.L D0,-(SP) LENGTH OF LINE
- MOVE.L INTE(PC),-(SP) TE RECORD
- _TEInsert
- MOVE.L (SP)+,A1
- WCL1 BSR WCR WRITE CR
- MOVE.L (SP)+,A5
- RTS
- WPB SPACE 4,10
- ** WPB - WRITE PRINTER BYTES.
-
- WPB MOVE.L D0,D2 BYTE COUNT
- MOVE.L A0,A2 LOCATION
- BSR PROP OPEN PRINTER
- MOVE.L D2,ioByteCount(A0)
- MOVE.L A2,ioBuffer(A0)
- _Write OUTPUT THE BYTES
- RTS
-
- WPOB LEA WPOC(PC),A0 WRITE ONE BYTE
- MOVE.B D0,(A0)
- MOVEQ #1,D0
- BRA WPB
-
- WPOC DS.B 1
- IOS SPACE 4,10
- ** IOS - I/O AND SYSTEM INTERFACE JUMP TABLE.
-
- IOPROP JMP PROP(PC) OPEN PRINTER DRIVER
- IOOPENR JMP IOPR(PC) OPEN FILE RESOURCE FORK
- IOSUBS DS 0 START OF I/O VECTOR TABLE
- IOASM JMP ASM(PC) WRITE APPL RESOURCE FILE
- IOCLS JMP CLS(PC) CLOSE FILE
- IODATIM JMP DAT(PC) GET DATE/TIME
- IOEND JMP ENDP(PC) END PROGRAM (LAUNCH FINDER)
- IOINIT JMP INIT(PC) INITIALIZE I/O ROUTINES
- IOINF JMP INF(PC) INITIALIZE FIT
- IOFSIZ JMP FSIZ(PC) RETURN FILE SIZE
- IOKBDR JMP KBDR(PC) PAUSE FOR KEYBOARD CHARACTER
- IOKBDS JMP KBDS(PC) GET KEYBOARD STATUS
- IOMSG JMP MSG(PC) ISSUE CONSOLE MESSAGE
- IOOPEN JMP IOP(PC) OPEN FILE
- IOPUR JMP PUR(PC) ERASE FILE
- IOREAD JMP FILLBUF(PC) READ INTO FIT BUFFER
- IOREADB JMP RDB(PC) READ BYTES
- IOREADO JMP RDO(PC) READ ONE BYTE
- IOSFN JMP SFN(PC) RESET FILE NAME INTO FIT
- IOWCR JMP WCR(PC) WRITE C/R TO SCREEN
- IOWCH JMP WCH(PC) WRITE CHARACTER TO SCREEN
- IOWCL JMP WCL(PC) WRITE CONSOLE LINE
- IOWRITE JMP WRITBUF(PC) WRITE FROM FIT BUFFER
- IOWRITEB JMP WTB(PC) WRITE BYTES
- IOWRITEO JMP WTO(PC) WRITE ONE BYTE
- IOWRITES JMP WTS(PC) WRITE STRING
- IORET SPACE 4,10
- IORET RTS RETURN TO CALLER
- ENDP SPACE 4,10
- ** ENDP - END PROGRAM.
- ENDP
- RTS
- FSIZ SPACE 4,10
- ** FSIZ - RETURN FILE SIZE.
- *
- * ENTRY A1 - FIT.
-
- FSIZ CLR.L D7
- BSR FILT
- BLE.S FSIZ1 IF NOT A DISK FILE
- NOP
- FSIZ1 RTS
- INF SPACE 4,10
- ** INF - INITIALIZE FIT.
- *
- * ENTRY A1 - FIT.
- * A2 - FILE BUFFER ADDRESS.
- * A3 - FILE NAME.
- * D1 - BUFFER SIZE.
- * D5 - FILE NAME EXTENSION.
-
- INF MOVE.L A1,A0
- AND.L #$FFFFFF80,D1 ROUND TO EVEN SECTOR
- MOVEQ #FITL/W-1,D0
- INF1 CLR (A0)+ CLEAR FIT AREA
- DBF D0,INF1
- MOVE.L A2,FBFW(A1) INITIALIZE BUFFER POINTERS
- MOVE.L A2,FBIW(A1)
- MOVE.L A2,FBOW(A1)
- ADD.L D1,A2
- ADDQ.L #1,A2
- MOVE.L A2,FBLW(A1)
- BSR SFN SET FILE NAME
- RTS
- INIT SPACE 4,10
- ** INIT - INITIALIZE I/O ROUTINES.
-
- INIT LEA INA5(PC),A3
- MOVE.L A5,(A3)+ A5 = MAC HEAP POINTER
- MOVE.L A4,(A3)+ TE HANDLE
- MOVE.L #' ',(A3) DEFAULT FILE TYPE
- RTS
- INA5 DS.B 4 MACS A5
- INTE DS.B 4 TE HANDLE
- INFT DS.B 4 FILE TYPE
- KBDR SPACE 4,10
- ** KBDR - PAUSE FOR KEYBOARD CHARACTER.
- *
- * ENTRY A1 - CONSOLE FIT.
-
- KBDR MOVE #$100,D2 DELAY COUNT
- MOVE D2,D3
- KBDR1 BSR KBDS
- BNE.S KBDR6 IF CHARACTER PRESENT
- DBF D2,KBDR1
- LEA KBDRA(PC),A0
- MOVEQ #4-1,D2
- KBDR2 MOVE.B (A0)+,D0 DISPLAY *MORE*
- BSR WCH
- DBF D2,KBDR2
- KBDR3 BSR KBDS CHECK KEYBOARD STATUS
- BNE.S KBDR4 IF CHARACTER PRESENT
- DBF D3,KBDR3
- KBDR4 MOVEQ #4-1,D2
- KBDR5 MOVE.B (A0)+,D0 UNDISPLAY *MORE*
- BSR WCH
- DBF D2,KBDR5
- TST D3
- BLT KBDR REPEAT WAIT LOOP
- KBDR6 BSR RDOK READ KEYBOARD CHARACTER
- RTS
-
- KBDRA DC.L 'MORE'
- KBDRB DC.L $08080808 BACKSPACES
- KBDS SPACE 4,10
- ** KBDS - GET KEYBOARD STATUS.
- *
- * EXIT CCR - .NE. IF CHARACTER PRESENT.
-
- KBDS MOVEM.L A0/A1/A5,-(SP)
- MOVE.L CurrentA5,A5
- CLR.B -(SP)
- MOVE #$0028,-(SP) GET KEY DOWN EVENTS
- PEA RDOA(PC)
- _EventAvail
- MOVE.B (SP)+,D0 GET IF CHARACTER PRESENT
- MOVEM.L (SP)+,A0/A1/A5
- RTS
- MSG SPACE 4,10
- ** MSG - DISPLAY CONSOLE MESSAGE.
- *
- * ENTRY A0 - ZERO BYTE TERMINATED MESSAGE.
-
- MSG MOVE.L A0,A2
- MSG1 MOVE.B (A2)+,D0 GET NEXT CHARACTER
- BEQ.S MSG2 IF AT END OF MESSAGE
- BSR WCH
- BRA MSG1
- MSG2 RTS
- IOP SPACE 4,10
- ** IOP - OPEN FILE.
- *
- * ENTRY A1 - FIT ADDRESS.
- * D0 - OPEN TYPE.
- * 0 - OPEN EXISTING FILE (WRITE ACCESS)
- * 1 - CREATE A FILE (ERROR IF ONE EXISTS).
- * 2 - OPEN A NEW FILE (OVERWRITES EXISTING FILE).
- * 3 - OPEN EXISTING FILE (READ ACCESS).
- *
- * EXIT CCR - .NE. IF ERROR.
- * D0 - ERROR CODE.
-
- IOP LEA FBFW(A1),A0 RESET BUFFER POINTERS
- MOVE.L (A0)+,(A0)
- MOVE.L (A0)+,(A0)
- BSR FILTF
- BLE.S IOPXX IF NOT A DISK FILE
- MOVE.L A5,-(SP)
- MOVE.L CurrentA5,A5
- MOVEQ #1,D2 READ PERMISSION
- CMP #3,D0
- BEQ.S IOP3 IF OPEN *READ*
- MOVEQ #2,D2 WRITE PERMISSION
- CMP #1,D0
- BLT.S IOP3 IF OPEN *WRITE*
- _Delete
- BEQ.S IOP1
- CMP #FNFERR,D0
- BNE.S IOPX IF ERROR ON DELETE
- IOP1 BSR CREATF
- BNE.S IOPX
- MOVEQ #2,D2 *WRITE* PERMISSION
- IOP3 MOVE.B D2,ioPermssn(A0) PERMISSION TYPE
- CLR.L ioOwnBuf(A0) USE VOLUME BUFFER
- _Open OPEN FILE
- BEQ.S IOPX IF FILE OPEN
- SUBQ #2,D2
- BNE.S IOPX IF NOT OPEN WRITE
- CMP #fnFerr,D0
- BEQ.S IOP1 CREATE FILE
- IOPX MOVE.L (SP)+,A5
- IOPXX RTS
- PUR SPACE 4,10
- ** PUR - PURGE A FILE.
- *
- * ENTRY A1 - FIT.
-
- PUR LEA FFPB(A1),A0
- _Delete
- RTS
- RDB SPACE 4,10
- ** RDB - READ BYTES.
- *
- * ENTRY A0 - DESTINATION BUFFER.
- * A1 - FIT.
- * D0 - BYTE COUNT.
- *
- * EXIT D0 - UNREAD BYTE COUNT IF EOF ENCOUNTERED.
-
- RDB MOVE.L FBOW(A1),A2
- MOVE.L D0,D1
- RDB1 BLE.S RDB3 IF ALL DATA READ
- RDB2 CMP.L FBIW(A1),A2
- BNE.S RDB4 IF DATA IN BUFFER
- BSR FILLBUF1 LOAD BUFFER
- MOVE.L FBOW(A1),A2
- BEQ.S RDB2 IF DATA NOW PRESENT
- RDB3 MOVE.L D1,D0
- RTS
- RDB4 MOVE.B (A2)+,(A0)+
- CMP.L FBLW(A1),A2
- BLT.S RDB5 IF NOT AT END OF BUFFER
- MOVE.L FBFW(A1),A2
- RDB5 MOVE.L A2,FBOW(A1) UPDATE DATA OUT POINTER
- SUBQ.L #1,D1
- BRA RDB1
- RDO SPACE 4,10
- ** RDO - READ ONE BYTE.
- *
- * ENTRY A1 - FIT.
- *
- * EXIT D0 - DATA BYTE READ.
- * D1 - MODIFIERS IF KEYBOARD READ.
- * CCR - .EQ. IF NO DATA AVAILABLE.
-
- RDO BSR FILT
- BLT.S RDO4 IF PRINTER
- BGT.S RDO1 IF DISK
- RDOK MOVEM.L A1/A5,-(SP)
- MOVE.L CurrentA5,A5
- CLR.B -(SP)
- MOVE #$0028,-(SP) GET KEY DOWN EVENTS
- PEA RDOA(PC)
- _GetNextEvent
- MOVE.B (SP)+,D0
- MOVEM.L (SP)+,A1/A5
- BEQ.S RDO4 IF NO DATA AVAILABLE
- MOVE RDOA+14(PC),D1 MODIFIERS
- MOVE.L RDOA+W(PC),D0
- RTS
- RDO1 MOVE.L FBOW(A1),A0
- CMP.L FBIW(A1),A0
- BEQ.S RDO3 IF BUFFER EMPTY
- MOVE.B (A0)+,D0 GET BYTE
- CMP.L FBLW(A1),A0
- BLT.S RDO2 IF NOT AT BUFFER LIMIT
- MOVE.L FBFW(A1),A0
- RDO2 MOVE.L A0,FBOW(A1)
- RTS
- RDO3 BSR FILLBUF1
- BEQ RDO1 IF DATA NOW IN BUFFER
- RDO4 CLR.B D0 SET NO DATA
- RTS
- RDOA DS.B 16 EVENT RECORD
- WTB SPACE 4,10
- ** WTB - WRITE BYTES.
- *
- * ENTRY A0 - SOURCE BUFFER.
- * A1 - FIT.
- * D0 - BYTE COUNT.
- *
- * EXIT CCR - .EQ. IF NO ERRORS.
- * D1 - ERROR CODE IF ERRORS.
-
- WTB MOVE.L D2,-(SP)
- MOVE.L D0,D2
- SUBQ.L #1,D2
- BLT.S WTB2 IF NULL BYTE COUNT
- BSR FILT
- BGT.S WTB3 IF DISK FILE
- BEQ.S WTB0 IF CONSOLE
- BSR WPB WRITE TO PRINTER
- BRA.S WTB2
-
- WTB0 MOVE.B 0(A0,D2),D1
- CMP.B #$0A,D1
- BNE.S WTB0.2 CHECK FOR LINE ENDING IN CR/LF
- MOVE D2,D0
- WTB0.1 BSR WCL WRITE ENTIRE LINE
- BRA.S WTB2
-
- WTB0.2 CMP.B #0D,D1
- BEQ WTB0.1
- WTB1 MOVE.B (A0)+,D0
- BSR WCH
- DBF D2,WTB1
- WTB2 MOVE.L (SP)+,D2 RESTORE SAVED REGISTER
- CLR D1
- RTS
-
- WTB3 MOVE.L FBIW(A1),A2
- WTB4 BLT.S WTB2 IF ALL DATA WRITTEN
- WTB5 MOVE.L A2,D0
- ADDQ.L #1,D0 ADVANCE DATA IN POINTER
- CMP.L FBLW(A1),D0
- BLT.S WTB6 IF NOT AT END OF BUFFER
- MOVE.L FBFW(A1),D0
- WTB6 CMP.L FBOW(A1),D0
- BNE.S WTB7 IF BUFFER NOT FULL
- MOVE.L A0,-(SP)
- MOVE.L D0,-(SP)
- BSR WRITBUF1 WRITE BUFFER
- BNE.S WTBER IF ERROR
- MOVE.L (SP)+,D0
- MOVE.L (SP)+,A0
- BRA WTB3
- WTB7 MOVE.B (A0)+,(A2)+ STUFF CHARACTER INTO BUFFER
- MOVE.L D0,A2
- MOVE.L A2,FBIW(A1)
- SUBQ.L #1,D2
- BRA WTB4
- WTBER ADDQ #8,SP
- MOVE.L (SP)+,D2
- MOVE D0,D1 SET ERROR CODE
- RTS
- WTO SPACE 4,10
- ** WTO - WRITE ONE BYTE.
- *
- * ENTRY A1 - FIT.
- * D0 - CHARACTER TO WRITE.
- *
- * EXIT CCR - .EQ. IF NO ERROR.
- * D1 - ERROR CODE.
-
- WTO BSR FILT
- BGT.S WTO5 IF DISK
- BEQ.S WTO4 IF CONSOLE
- BSR WPOB WRITE PRINTER BYTE
- WTO3 CLR D1
- RTS
-
- WTO4 BSR WCH
- BRA WTO3
-
- WTO5 MOVE.L FBIW(A1),A0
- MOVEQ #1,D1
- ADD.L A0,D1
- CMP.L FBLW(A1),D1
- BLT.S WTO6 IF NOT AT END OF BUFFER
- MOVE.L FBFW(A1),D1
- WTO6 CMP.L FBOW(A1),D1
- BNE.S WTO7 IF BUFFER NOT FULL
- BSR WRITBUF1
- BNE.S WTO8 IF ERROR ON WRITE
- BRA WTO4
- WTO7 MOVE.B D0,(A0) STORE CHARACTER
- MOVE.L D1,FBIW(A1) UPDATE BUFFER PTR
- CLR D0
- WTO8 RTS
- WTS SPACE 4,10
- ** WTS - WRITE STRING.
- *
- * ENTRY A0 - ZERO BYTE TERMINATED STRING.
- * A1 - FIT.
- *
- * EXIT CCR - .NE. IF ERROR.
- * D1 - ERROR CODE.
- *
-
- WTS MOVE.L A0,A2
- WTS1 MOVE.B (A2)+,D0
- BEQ.S WTS2 IF END OF STRING
- BSR WTO WRITE BYTE
- BNE.S WTS2 IF ERROR
- BRA WTS1
- WTS2 RTS
- FILLBUF SPACE 4,10
- ** FILLBUF - READ SECTOR(S) FROM DISK.
- *
- * EXIT CCR - .NE. IF FILE EMPTY.
-
- FILLBUF BSR FILT
- BLE.S FILL4 IF NOT DISK
- FILLBUF1 MOVEM.L A0/A5/D1/D3,-(SP) SAVE REGISTERS
- LEA FFPB(A1),A0 FILE PARAMETER BLOCK
- MOVE.L FBFW(A1),D1 RESET BUFFER POINTERS
- MOVE.L D1,FBIW(A1)
- MOVE.L D1,FBOW(A1)
- MOVE.L #128,D3
- FILL1 MOVE.L A5,-(SP)
- MOVE.L CurrentA5,A5
- MOVE.L FBIW(A1),ioBuffer(A0) READ BUFFER
- MOVE.L D3,ioByteCount(A0) BYTE COUNT
- _Read
- MOVE.L (SP)+,A5
- BNE.S FILL5 IF ERROR ON READ
- ADD.L #128,FBIW(A1) ADVANCE PTR BY ONE SECTOR
- MOVE.L FBLW(A1),D0
- SUBQ.L #1,D0
- CMP.L FBIW(A1),D0
- BGT FILL1 IF BUFFER NOT FULL
- FILL2 CLR.L D0
- FILL3 MOVEM.L (SP)+,A0/A5/D1/D3
- TST.L D0
- FILL4 RTS
- FILL5 MOVEQ #1,D0
- MOVE.L ioNumDone(A0),D3 ACTUAL BYTE COUNT READ
- ADD.L D3,FBIW(A1)
- MOVE.L FBIW(A1),D3
- SUB.L FBFW(A1),D3
- BNE FILL2 IF DATA READ
- BRA FILL3
- FILT SPACE 4,10
- ** FILT - DETERMINE DEVICE TYPE.
- *
- * ENTRY A1 - FIT.
- *
- * EXIT CCR - .GT. IF DISK FILE.
- * .EQ. IF CONSOLE.
- * .LT. IF PRINTER.
-
- FILTF LEA FFPB(A1),A0 SET FILE PARAMETER BLOCK
- MOVE.L A0,D1
- FILT CMP.L #'CON:',FNAM(A1)
- BEQ.S FLT2 IF CONSOLE
- CLR -(SP)
- CMP.L #'LST:',FNAM(A1)
- BEQ.S FLT1 IF PRINTER
- MOVE #2,(SP)
- FLT1 SUBQ #1,(SP)+
- FLT2 RTS
- WRITBUF SPACE 4,10
- ** WRITBUF - WRITE OUT BUFFER.
- *
- * ENTRY A1 - FIT.
- *
- * EXIT CCR - .EQ. IF WRITE OK.
- * D0 - DISK WRITE STATUS.
- * D1 - FCB ADDRESS.
-
- WRITBUF BSR FILT
- BLE.S WRT3 IF NOT DISK FILE
- WRITBUF1 LEA FFPB(A1),A0 FPB ADDRESS
- WRT1 MOVE.L A5,-(SP)
- MOVE.L CurrentA5,A5
- MOVE.L FBOW(A1),ioBuffer(A0)
- MOVE.L #128,ioByteCount(A0)
- _Write WRITE SECTOR
- MOVE.L (SP)+,A5
- BNE.S WRT4 IF ERROR ON WRITE
- ADD.L #128,FBOW(A1) ADVANCE SECTOR COUNT
- MOVE.L FBIW(A1),D0
- SUB.L FBOW(A1),D0
- BEQ.S WRT2 IF EMPTY
- BMI.S WRT4 IF PTRS OFF SHOULD NOT HAPPEN
- CMP.L #128,D0
- BGE WRT1 IF BUFFER NOT EMPTY
- BRA.S WRT3
- WRT2 MOVE.L FBFW(A1),D0 RESET PTRS
- MOVE.L D0,FBIW(A1)
- MOVE.L D0,FBOW(A1)
- WRT3 CLR D0
- WRT4 RTS
-
- END